#!/usr/bin/perl -w

#################################################### Changelog ####################################################
### 0.1 - Criação do script										        ###
### 0.2 - Documentação												###
###################################################################################################################

### Módulos utilizados
use strict;
use warnings;
use File::Basename;
use Getopt::Long qw(:config no_ignore_case);
use Filesys::SmbClientParser;
use POSIX;

### Variáveis globais
our %info;
our $opt_help;
our $opt_version;
our $opt_host;
our $opt_user;
our $opt_pass;
our $opt_domain;
our $opt_debug;
our $opt_dir;
our $opt_file;
our $opt_warn;
our $opt_crit;
our $opt_ok;
our $opt_err;

### Informações do desevolvimento
%info = (
	'autor'       => 'Raul Liota',
	'autor_email' => 'raul.liota@gmail.com',
	'version'     => '0.2' ,
	'plugin_name' => basename($0)
);

### Sub-rotina 'main' - Essa rotina executa a parte principal do código
sub main {
	
	### Chama a sub-rotina 'parseArgs'
	&parseArgs;

	### Variáveis locais
	my $ontem = &yesterday;
	my $sucesso=0;
	my $falha=0;

	### Conexão com o share atavés do módulo 'Filesys::SmbClientParser'
	my $smb = new Filesys::SmbClientParser (undef,
					(user 		=>	$opt_user,
					password	=>	$opt_pass,
					workgroup	=>	$opt_domain,
					debug		=> 	$opt_debug	
					));

	$smb->Host($opt_host);
	$smb->Share($opt_dir);
	
	### Faz download do arquivo do texto para o diretório /tmp local
	$smb->get($opt_file,"/tmp/$opt_file") or die("THERE WAS AN ERROR SMBERR: " . $smb->err);
	
	### Abre o arquivo para a leitura
	open(FILE,"/tmp/$opt_file");

	### Loop para verificar a quantidade de falhas encontradas dentro do arquivo, percorrendo linha por linha
	while(<FILE>) {
		if (m/^(\d{2}\/\d{2}\/\d{4}).*: Imagem.*\" (.*)/g) {
			if ($1 eq $ontem) {
            	if ($2 =~ m/$opt_ok/g ){
            		$sucesso++;
            	} elsif ($2 =~ m/$opt_err/g ) {
            		$falha++;
            	}
        	}
		}
	}
	
	### Fecha o arquivo texto e remove ele do diretório /tmp local
	close(FILE); 
	unlink("/tmp/log_remocao.log");

	### Variável local para métrica de performance
	my $perf = "removidas=$sucesso;$opt_warn;$opt_crit;0; falha=$falha;$opt_warn;$opt_crit;0;"; 
	
	### Verifica se o número de falhas é maior que o número de alertas ou critico configurados pelo usuário e exibi retorno do script
	if (($falha >= $opt_warn) && ($falha < $opt_crit)) {
		print "WARNING - Removidas: $sucesso - Nao removidas: $falha | $perf\n";
	} elsif ($falha > $opt_crit) {
		print "CRITICAL - Removidas: $sucesso - Nao removidas: $falha | $perf\n"
	} else {
		print "OK - Removidas: $sucesso - Nao removidas: $falha | $perf\n";
	} 	
	
} ### Fim da sub-rotina 'main' 

### Sub-rotina 'yesterday' - Essa rotina pega a data local e converte ela para a data do dia anterior formatando ela para o formato do arquivo texto
sub yesterday {
		
	my $yestertime = time - 86400;
	my $month = (localtime $yestertime)[4] + 1;
	my $day = (localtime $yestertime)[3];
	my $year = (localtime $yestertime)[5] + 1900;
	my $data = sprintf ("%02d/%02d/%d", $day, $month, $year);
	return ($data);
	
} ### Fim da sub-rotina 'yesterday'

### Sub-rotina 'parseArgs' - Essa rotina captura as informações passadas pelo usuário na execução do script e popula suas variáveis correspondentes
sub parseArgs {
	
	### Chama funçao GetOptions do módulo Getopt::Long para capturar informações enviadas pelo usuário
	GetOptions (
		"h|help"	=> \$opt_help,
		"v|version"	=> \$opt_version,
		"H|host=s"	=> \$opt_host,
		"u|user=s"  	=> \$opt_user,
		"p|password=s"  => \$opt_pass,
		"W|domain=s"    => \$opt_domain,
		"d|debug=s"	=> \$opt_debug,
		"D|dir=s"   	=> \$opt_dir,
		"f|file=s"  	=> \$opt_file,
		"w|warning=i"	=> \$opt_warn,
		"c|critical=i"	=> \$opt_crit,
		"o|ok=s"	=> \$opt_ok,
		"e|erro=s"	=> \$opt_err	
	);	
	
	### Verifica se os parâmetros obrigatórios foram preenchidos pelo usuário, senão exibe o Help
	if (!defined($opt_host) && !defined($opt_user) && !defined($opt_pass) && !defined($opt_dir) && !defined($opt_file) && !defined($opt_version)) {
		&printHelp;
		exit 3;
  	}
  	
  	### Exibe o Help caso seja setado a opção -h ou --help
	if (defined($opt_help)) {
		&printHelp;
		exit 0;
	}
	
	### Exibe a versão do script caso seja setado a opção -v ou --version
	if (defined($opt_version)) {
		print "Version: $info{version}\n";
		exit 0;
	}

} ### Fim do 

### Sub-rotina 'printHelp' - Rotina para exibir o Help
sub printHelp {
	
	### Chama a sub-rotina 'printUsage'
	&printUsage;
	
	### Exibe o Help
	print <<EOT
	Autor : $info{autor}
	Email : $info{autor_email}
	Versao: $info{version}
	
	Faz um parse de um arquivo de log compartilhado através de SMB para verificação se as imagens das cameras da Cimfel foram removidas corretamente.

	Parametros:

	-h | --help		Exibe o a página de ajuda.
	-v | --version	Exibe a versão do plugin.
	-u | --user  	Usuario para acesso ao compartilhamento.
	-p | --password Senha do usuario para acesso ao compartilhamento.
	-H | --host   IP/HOSTNAME do host onde se encontra o compartilhamento. 
	-W | --domain	Domínio do host onde está o compartilhamento.
	-D | --dir		Diretório compartilhado.
	-f | --file		Arquivo de log compartilhado.
	-d | --debug	Utilizado para debug do smbclient.
EOT

} ### Fim da sub-rotina 'printHelp'

### Sub-rotina 'printUsage' - Exibe as formas de execução do script
sub printUsage {
	print <<EOH
	Exemplos:

	$info{plugin_name} -h
	$info{plugin_name} -v
	$info{plugin_name} -s <ip> -u <usuario> -p <senha> -W [dominio] -D <diretório> -f <arquivo> -d [level_debug_smbclient]\n
EOH
} ### Fim da sub-rotina 'printUsage'

### Chama a sub-rotina 'main'
&main;